import math

class Shape:
    """图形基类"""
    def area(self):
        """计算面积"""
        raise NotImplementedError("子类必须实现面积计算方法")
    
    def perimeter(self):
        """计算周长"""
        raise NotImplementedError("子类必须实现周长计算方法")


class Circle(Shape):
    """圆形类"""
    def __init__(self, radius):
        self.radius = radius
        
    def area(self):
        """计算圆的面积: πr²"""
        return math.pi * self.radius ** 2
    
    def perimeter(self):
        """计算圆的周长: 2πr"""
        return 2 * math.pi * self.radius


class Square(Shape):
    """正方形类"""
    def __init__(self, side):
        self.side = side
        
    def area(self):
        """计算正方形的面积: 边长²"""
        return self.side ** 2
    
    def perimeter(self):
        """计算正方形的周长: 4×边长"""
        return 4 * self.side


class Rectangle(Shape):
    """长方形类"""
    def __init__(self, length, width):
        self.length = length
        self.width = width
        
    def area(self):
        """计算长方形的面积: 长×宽"""
        return self.length * self.width
    
    def perimeter(self):
        """计算长方形的周长: 2×(长+宽)"""
        return 2 * (self.length + self.width)


class Triangle(Shape):
    """三角形类"""
    def __init__(self, a, b, c):
        # 验证三角形三边是否合法
        if a + b <= c or a + c <= b or b + c <= a:
            raise ValueError("给定的三边无法构成三角形")
        self.a = a
        self.b = b
        self.c = c
        
    def area(self):
        """使用海伦公式计算三角形面积"""
        s = (self.a + self.b + self.c) / 2
        return math.sqrt(s * (s - self.a) * (s - self.b) * (s - self.c))
    
    def perimeter(self):
        """计算三角形的周长: 三边之和"""
        return self.a + self.b + self.c


class Trapezoid(Shape):
    """梯形类"""
    def __init__(self, a, b, h, c, d):
        self.a = a  # 上底
        self.b = b  # 下底
        self.h = h  # 高
        self.c = c  # 腰1
        self.d = d  # 腰2
        
    def area(self):
        """计算梯形的面积: (上底+下底)×高÷2"""
        return (self.a + self.b) * self.h / 2
    
    def perimeter(self):
        """计算梯形的周长: 上底+下底+两腰之和"""
        return self.a + self.b + self.c + self.d


def main():
    print("图形面积和周长计算器")
    print("支持的图形: 1.圆形 2.正方形 3.长方形 4.三角形 5.梯形")
    
    # 创建图形实例列表
    shapes = []
    
    # 获取圆形参数并创建实例
    try:
        radius = float(input("请输入圆形的半径: "))
        circle = Circle(radius)
        shapes.append(("圆形", circle))
    except ValueError:
        print("圆形参数输入错误，将跳过该图形")
    
    # 获取正方形参数并创建实例
    try:
        side = float(input("请输入正方形的边长: "))
        square = Square(side)
        shapes.append(("正方形", square))
    except ValueError:
        print("正方形参数输入错误，将跳过该图形")
    
    # 获取长方形参数并创建实例
    try:
        length = float(input("请输入长方形的长: "))
        width = float(input("请输入长方形的宽: "))
        rectangle = Rectangle(length, width)
        shapes.append(("长方形", rectangle))
    except ValueError:
        print("长方形参数输入错误，将跳过该图形")
    
    # 获取三角形参数并创建实例
    try:
        a = float(input("请输入三角形的第一条边: "))
        b = float(input("请输入三角形的第二条边: "))
        c = float(input("请输入三角形的第三条边: "))
        triangle = Triangle(a, b, c)
        shapes.append(("三角形", triangle))
    except (ValueError, Exception) as e:
        print(f"三角形参数输入错误: {e}，将跳过该图形")
    
    # 获取梯形参数并创建实例
    try:
        a = float(input("请输入梯形的上底: "))
        b = float(input("请输入梯形的下底: "))
        h = float(input("请输入梯形的高: "))
        c = float(input("请输入梯形的第一条腰: "))
        d = float(input("请输入梯形的第二条腰: "))
        trapezoid = Trapezoid(a, b, h, c, d)
        shapes.append(("梯形", trapezoid))
    except ValueError:
        print("梯形参数输入错误，将跳过该图形")
    
    # 输出计算结果
    print("\n===== 计算结果 =====")
    for name, shape in shapes:
        print(f"{name}:")
        print(f"  面积: {shape.area():.2f}")
        print(f"  周长: {shape.perimeter():.2f}")
        print("---------------------")


if __name__ == "__main__":
    main()
